home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldpcx04
/
ldpcx04s.lzh
/
LDPCX.S
< prev
next >
Wrap
Text File
|
1997-07-23
|
54KB
|
2,389 lines
*********************************************************************************
* PCX Loader <LDPCX.X Ver. 0.03> *
*********************************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xref _pcx4_prt
.xref _pcx4_scroll
.xref _pcx8_prt
.xref _pcx8_scroll
.xref _pcx24_prt
.xref _pcx24_scroll
.xref _Tone_down
.xref _Tone_up
.xref _Wait
.xdef key_chk
.xdef tenkey_chk
.xdef cursor_chk
.xdef mouse_chk
.xdef x_set
.xdef y_set
.xdef v_wait
.xdef inf_change
.xdef tate
.xdef yoko
.xdef x_max
.xdef y_max
.xdef x_pos
.xdef y_pos
.xdef crt_y
.xdef gr_addr
.xdef buff_addr
.xdef fi_size
.xdef kflg
.xdef mflg
.xdef esc_flg
.xdef next_flg
.xdef inkey_flg3
.xdef scroll_key
.xdef s_dot4
.xdef s_dot8
.xdef s_dot24
pcx_header:
p_type: equ 0 *ファイル識別子?
p_bpp: equ 3 *
p_sx equ 4 *開始x,y座標
p_sy equ 4 *
p_ex: equ 8 *終了x,y座標
p_ey: equ 10 *
p_dummy2: equ 12 *?
p_pal: equ 16 *パレットデータの先頭
p_npl: equ 65 *
p_bpl: equ 66 *
p_image: equ 128 *イメージデータの先頭
COL16 equ $0A050101
COL256 equ $0A050108
S_DOT equ 8
.text
start:
lea.l mysp(pc),sp *スタックセット
move.l a0,-(sp) *a0とっておく
lea.l 16(a0),a0 *余分なメモリ開放
suba.l a0,a1
move.l a1,-(sp)
move.l a0,-(sp)
DOS _SETBLOCK
addq.l #8,sp
move.l (sp)+,a0 *a0戻す
bsr wait_path_set *waitデータのパス設定
bsr wait_read *waitデータの読み込み
bsr cmdchk *コマンドラインの解析
bsr buf_get *バッファ確保
bsr super *スーパーモードへ
bsr cursol_clr *カーソル消す
bsr name_get *ファイル名を取得し処理する
bsr user *ユーザモードへ
bsr buf_free *バッファ開放
bsr wait_write *waitデータの書き込み
bsr exit *終了処理
DOS _EXIT
*****************************************************************
* ファイル名を取得し、ファイルの読み込みを行う *
*****************************************************************
name_get:
clr.w file_cnt *ファイル数のカウント初期化
bsr chkname *ファイル名に対する前処理
bsr chkext *拡張子が省略されているかチェック
move.w #ARCHIVE,-(sp) *最初のファイルを検索する
pea.l arg(pc) *
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
loop:
tst.l d0 *ファイルは見つかったか?
bmi done * 見つからなければ処理完了
bsr setpath *得られたファイル名を
* フルパスに再構成する
bsr main *メイン処理
tst.b esc_flg *エスケープ?
bne done
pea.l filbuf(pc) *つぎのファイルを検索する
DOS _NFILES *
addq.l #4,sp *
bra loop *繰り返す
done:
bsr file_cnt_chk *処理したファイル数のチェック
rts
*****************************************************************
* files実行に先立ってファイル名に前処理を加える *
*****************************************************************
chkname:
pea.l nambuf(pc) *ファイル名を展開する
pea.l arg(pc) *
DOS _NAMECK *
addq.l #8,sp *
tst.l d0 *d0<0なら
bmi name_er * ファイル名の指定に誤りがある
beq nowild *d0=0ならワイルドカード指定なし
cmpi.w #$00ff,d0 *d0≠FFHなら
bne wild * ワイルドカード指定あり
noname: *ファイル名が指定されていない場合
lea.l arg(pc),a0 *バッファargに
lea.l nambuf(pc),a1 * nameckで展開したパス名+'*.PCX'
bsr strcpy * を再構成する
lea.l kome0(pc),a1 *
bsr strcpy *
wild: *ワイルドカードが指定された場合
*何もしなくてよい
cknam0:
rts
nowild: *ワイルドカードが指定されていない場合
move.w #SUBDIR,-(sp) *サブディレクトリであると仮定して
pea.l arg(pc) * 検索してみる
pea.l filbuf(pc) *
DOS _FILES *
lea.l 10(sp),sp *
tst.l d0 *見つかったか?
bmi cknam0 * 見つからなければファイルだろう
lea.l arg(pc),a0 *バッファargに
lea.l komekome(pc),a1 * もとのファイル名+'\*.PCX'
bsr strcat * を再構成する
bra chkname *nameckでファイル名を展開するために
* サブルーチン先頭に戻る
*****************************************************************
* files,nfilesで見付けたファイル名をフルパスに構成し直し *
* arg以降に格納する *
*****************************************************************
setpath:
lea.l arg(pc),a0 *a0=コピー先
lea.l nambuf(pc),a1 *a1=nameckで展開したパス名
bsr strcpy *コピーする
lea.l filbuf(pc),a1 *a1=files,nfilesで見付けたファイル名
lea.l 30(a1),a1
bsr strcpy *連結する
rts
*****************************************************************
* 文字列の連結および複写 *
* リターン時a0は文字列末の00Hを指す *
*****************************************************************
strcat:
tst.b (a0)+ *(a0)は0か?
bne strcat *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
strcpy:
move.b (a1)+,(a0)+ *1文字ずつ
bne strcpy *終了コードまでを転送する
subq.l #1,a0 *a0は進み過ぎている
*a0は文字列末の00Hを指す
rts
*****************************************************************
* 拡張子を補う *
*****************************************************************
chkext:
lea.l arg(pc),a0 *ファイル名のアドレス
lea.l dext(pc),a1 *拡張子のアドレス
chkext0:
cmp.b #".",(a0) *拡張子があるか
beq chkext2
tst.b (a0)+ *(a0)は0か?
bne chkext0 *そうでなければ繰り返す
subq.l #1,a0 *行きすぎたから1つ戻る
chkext1:
move.b (a1)+,(a0)+ *1文字転送
bne chkext1 *終了コードまで繰り返す
chkext2:
rts
*****************************************************************
* コマンドラインのチェックを行う *
*****************************************************************
cmdchk:
lea.l arg(pc),a0 *a0=引数切り出し領域
addq.l #1,a2 *a2=コマンドライン文字列先頭
move.w #1,clr_mode *画面クリアモードの初期値
clr.w bit4_crtdef *16色PCXの画面モード初期値
clr.w x_pos *ロード座標の初期化
clr.w y_pos
cmdchk0:
bsr switch_chk *スイッチのチェック
tst.b (a2) *引数があるか?
beq usage *ないならファイル名が足りない
bsr getarg *ファイル名切り出し
bsr switch_chk *さらにスイッチのチェック
tst.b (a2) *引数があるか?
bne usage * あるなら引数が多い
cmdchk1:
rts
*****************************************************************
* スペースを飛ばしつぎの引数先頭までポインタを進め *
* スイッチがあれば処理してしまう *
*****************************************************************
switch_chk:
bsr skipsp *スペースをスキップする
tst.b (a2) *まだスイッチがあるか?
beq switch_chk2 *ないなら戻る(処理の振り分けを行う)
cmpi.b #'/',(a2) *引数の先頭が
beq switch_chk1 */,-であれば
cmpi.b #'-',(a2) * スイッチ
beq switch_chk1 *
bra switch_chk2 *スイッチでないなら戻る
switch_chk1:
addq.l #1,a2 *'/'や'-'の分ポインタを進める
tst.b (a2) *スイッチがあるか?
beq usage * ないなら使用方表示
move.b (a2)+,d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmpi.b #'K',d0 *Kスイッチ?
beq ksw * そうなら分岐
cmpi.b #'S',d0
beq ssw
cmpi.b #'C',d0
beq csw
cmpi.b #'L',d0
beq lsw
cmpi.b #'D',d0
beq dsw
cmpi.b #'M',d0
beq msw
bra usage *無効なスイッチが指定された
ksw:
tst.b kflg *スイッチの二重指定チェック
bne usage
st kflg *KスイッチON
bra switch_chk *まだスイッチがあるかもしれない
ssw:
bsr ssw_ana
bra switch_chk
csw:
bsr csw_ana
bra switch_chk
lsw:
bsr lsw_ana
bra switch_chk
dsw:
tst.b dflg
bne usage
st dflg
bra switch_chk
msw:
tst.b mflg
bne usage
st mflg
bra switch_chk
switch_chk2:
rts
*****************************************************************
* Sスイッチの解析 *
*****************************************************************
ssw_ana:
tst.b sflg *Sスイッチの2重指定
bne usage
st sflg
move.b (a2),d0 *1文字取り出す
cmp.b #' ',d0 *Sだけかな
beq ssw_ana9 *画面モードの指定なし
ssw_ana1:
bsr num_read *
cmp.w crt_max(pc),d0 *
bhi usage
move.w d0,bit4_crtdef
subq.l #1,a2 *1文字戻す
ssw_ana9:
rts
*****************************************************************
* Cスイッチの解析 *
*****************************************************************
csw_ana:
tst.b cflg *Cスイッチの2重指定
bne usage
st cflg
* move.w #3,clr_mode */cだけのときは'3'をデフォルト
move.b (a2),d0 *1文字取り出す
cmp.b #' ',d0 *Cだけかな
beq csw_ana9 *画面クリアモードの指定なし
csw_ana1:
bsr num_read *
cmp.w #3,d0 *
bhi usage
move.w d0,clr_mode
subq.l #1,a2 *1文字戻す
csw_ana9:
rts
*****************************************************************
* Lスイッチの解析 *
*****************************************************************
lsw_ana:
move.b (a2),d0 *1文字取り出す
bsr toupper *大文字に変換しておく
cmp.b #'C',d0 *LCかな
bne lsw_ana1
tst.b lflg *Lスイッチも指定している
bne usage
tst.b lcflg *LCスイッチの2重指定
bne usage
st lcflg *LCスイッチオン
addq.l #1,a2 *1文字進める
bra lsw_ana9
lsw_ana1:
cmp.b #' ',d0 *Lだけかな
beq lsw_ana9 *ロード座標を指定してない
lsw_ana2:
bsr num_read *Xチェック
cmp.w #1023,d0 *Xが1023を越える時
bhi but_pos
move.w d0,x_pos
cmp.b #',',-1(a2)
bne usage
bsr num_read *Yチェック
cmp.w #1023,d0 *Yが1023を越える時
bhi but_pos
move.w d0,y_pos
st lflg *Lスイッチオン
subq.l #1,a2 *1文字戻す
lsw_ana9:
rts
*****************************************************************
* 数字の解析 d0に数字を返す *
*****************************************************************
num_read:
clr.w d0
num_read0:
clr.w d1
move.b (a2)+,d1
sub.b #'0',d1
cmp.b #10,d1
bcc.b num_read1
mulu #10,d0
add.w d1,d0
bra.b num_read0
num_read1:
rts
*****************************************************************
* ファイル名を切り出す *
*****************************************************************
getarg:
move.l a0,-(sp) *{レジスタ待避
gtarg0: tst.b (a2) *1)文字列の終端コードか
beq gtarg1 *
cmpi.b #SPACE,(a2) *2)スペースか
beq gtarg1 *
cmpi.b #TAB,(a2) *3)タブか
beq gtarg1 *
* cmpi.b #'-',(a2) *4)ハイフンか
* beq gtarg1 *
cmpi.b #'/',(a2) *5)スラッシュ
beq gtarg1 *
move.b (a2)+,(a0)+ * が現れるまで転送を
bra gtarg0 * 繰り返す
gtarg1: clr.b (a0) *文字列終端コードを書き込む
movea.l (sp)+,a0 *}レジスタ復帰
rts
*****************************************************************
* スペース・TABをスキップする *
*****************************************************************
skipsp0:
addq.l #1,a2
skipsp:
cmpi.b #$20,(a2)
beq skipsp0
cmpi.b #$09,(a2)
beq skipsp0
rts
*****************************************************************
* 小文字→大文字変換ルーチン *
*****************************************************************
toupper:
cmpi.b #'a',d0
bcs toupr0
cmpi.b #'z'+1,d0
bcc toupr0
subi.b #$20,d0
toupr0:
rts
*****************************************************************
* メイン処理 *
*****************************************************************
main:
lea.l arg(pc),a0 *ファイル名セット
bsr file_open *ファイルオープン
bsr file_size *ファイルサイズを調べる
move.l d6,fi_size *ファイルサイズセーブ
movea.l buff_addr(pc),a4 *バッファアドレス
move.l #128,d6 *読み込むサイズ
bsr file_read *ヘッダ部分を読む
bsr size_chk *画像サイズのチェック
tst.b skip_flg
bne main9
bsr crtmode_set *画面モードの設定
bsr scroll_var_set *スクロール変数の設定
bsr lsw_chk *ロード座標・センタリングチェック
tst.b int_flg *1回目のグラフィック初期化ここで行う
bne main1
bsr gr_off *グラフィック画面オフ
bsr scr_int *画面の初期化
bsr crtmode_int *画面モードの初期化
bsr scroll_int *スクロール座標の初期化
bsr gr_int *グラフィック画面の初期化チェック
main1:
movea.l buff_addr(pc),a4 *バッファアドレス
lea.l 128(a4),a4
move.l fi_size(pc),d6
sub.l #128,d6
bsr file_read
bsr file_close
main2:
bsr pcx_tenkai *PCX展開
main3:
tst.b int_flg *2回目以降のグラフィック初期化ここで行う
beq main4
bsr gr_off *グラフィック画面オフ
bsr crtmode_int *画面モードの初期化
bsr scroll_int *スクロール座標の初期化
bsr gr_int *グラフィック画面の初期化チェック
main4:
bsr pal_set *パレット設定
bsr gr_on *グラフィック画面オン
bsr inf_mode *
bsr pcx_prt *PCX表示
main8:
bsr scroll *グラフィックをスクロール
add.w #1,file_cnt *ファイル数のカウント+1
main9:
rts
*****************************************************************
* ファイルヘッダから画像サイズを求める *
*****************************************************************
size_chk:
movea.l buff_addr(pc),a0 *読み込んだデータの先頭
cmp.l #COL16,p_type(a0) *16color?
beq size_chk0
cmp.l #COL256,p_type(a0) *256 or Fullcolor?
beq size_chk0
bsr but_col_err
bra size_chk9
size_chk0:
move.w p_sx(a0),d0 *横サイズ求める
ror.w #8,d0
move.w p_ex(a0),d1
ror.w #8,d1
sub.w d0,d1
addq.w #1,d1
move.w d1,yoko
move.w p_sy(a0),d0 *縦サイズ求める
ror.w #8,d0
move.w p_ey(a0),d1
ror.w #8,d1
sub.w d0,d1
addq.w #1,d1
move.w d1,tate
moveq.l #0,d0 *使用ビット数
move.b p_bpp(a0),d0
move.w d0,bpp
move.b p_npl(a0),d0
move.w d0,npl
move.w p_bpl(a0),d0
ror.w #8,d0
move.w d0,bpl
cmp.b #4,npl *4プレーン以下か
bls size_chk1 *そう
bsr but_col_err
bra size_chk9
size_chk1:
move.l buff_addr(pc),d0 *ワークアドレスを求める
add.l fi_size(pc),d0
btst.l #0,d0
beq size_chk2
addq.l #1,d0
size_chk2:
move.l d0,work_addr
move.w bpp(pc),d1 *ワークサイズ求める
mulu.w npl(pc),d1
move.w d1,bit_cnt *画像のビット数
mulu.w bpl(pc),d1
btst.l #0,d1
beq size_chk3
addq.l #1,d1
size_chk3:
add.l d0,d1 *グラフィック格納アドレス求める
addq.l #4,d1 *謎の差分をたす
move.l d1,gr_addr
bsr tenkai_size_get *展開後のグラフィックサイズ求める
move.l gr_addr(pc),d1 *表示するメモリがあるか
add.l d0,d1
sub.l buff_addr(pc),d1
cmp.l buff_size(pc),d1
bls size_chk8
bsr no_buff *メモリが無い
bra size_chk9
size_chk8:
sf skip_flg
rts
size_chk9:
st skip_flg
rts
tenkai_size_get:
cmp.w #8,bit_cnt
bcs ts4_get
beq ts8_get
bra ts24_get
ts4_get:
move.w yoko(pc),d0
addq.w #7,d0
lsr.w #1,d0
and.w #$fffc,d0
bra ts_get
ts8_get:
move.w yoko(pc),d0
addq.w #3,d0
andi.w #$fffc,d0
bra ts_get
ts24_get:
move.w yoko(pc),d0
add.w d0,d0
* bra ts_get
ts_get:
mulu.w tate(pc),d0
rts
*****************************************************************
* ロード座標のチェック *
*****************************************************************
lsw_chk:
tst.b lflg *Lスイッチ指定
bne l_chk *指定あり
tst.b lcflg *LCスイッチ指定
bne lc_chk *指定あり
rts
l_chk:
move.w x_pos(pc),d0 *横にはみ出るか
beq l_chk1
add.w yoko(pc),d0
cmp.w crt_x(pc),d0
bhi but_pos *はみ出る
l_chk1
move.w y_pos(pc),d0 *縦にはみ出るか
beq l_chk2
add.w tate(pc),d0
cmp.w crt_y(pc),d0
bhi but_pos *はみ出る
l_chk2
rts
lc_chk:
clr.w x_pos *ロード座標の初期化
clr.w y_pos
move.w crt_x(pc),d0 *X方向のセンタリング
sub.w yoko(pc),d0
bmi lc_chk1
lsr.w #1,d0 *d0を1/2
move.w d0,x_pos
lc_chk1:
move.w crt_y(pc),d0 *Y方向のセンタリング
sub.w tate(pc),d0
bmi lc_chk2
lsr.w #1,d0 *d0を1/2
move.w d0,y_pos
lc_chk2:
rts
*****************************************************************
* パレット設定 *
*****************************************************************
pal_set:
cmp.w #8,bit_cnt
bcs pal_set4
beq pal_set8
bra pal_set24
pal_set4:
move.l buff_addr(pc),a0 *パレットアドレス
lea.l p_pal(a0),a0 *変換元
movea.l #GPAL,a1
move.w #16-1,d0 *パレット数
pal_set4_0:
move.w #$00f8,d7 *マスクデータ
pal_set4_1:
move.b (a0)+,d3 *B
move.b (a0)+,d2 *G
move.b (a0)+,d1 *R
and.w d7,d1
and.w d7,d2
and.w d7,d3
lsr.w #2,d1
lsl.w #3,d3
lsl.w #8,d2
or.w d2,d1
or.w d3,d1
move.w d1,(a1)+
dbra d0,pal_set4_1
bra pal_set_end
pal_set8:
move.l buff_addr(pc),a0 *パレットアドレス
add.l fi_size(pc),a0
sub.l #256*3,a0
movea.l #GPAL,a1
move.w #256-1,d0 *パレット数
bra pal_set4_0
pal_set24: *65536色標準パレット
moveq.l #$0001,d0
move.l #$0202,d1
movea.l #GPAL,a0
moveq.l #512/4-1,d2
pal_set24_1:
move.w d0,(a0)+
move.w d0,(a0)+
add.l d1,d0
dbra d2,pal_set24_1
pal_set_end:
rts
*****************************************************************
* PCX展開 *
*****************************************************************
pcx_tenkai:
move.l buff_addr(pc),a2 *変換前画像アドレス
lea.l p_image(a2),a2
move.w npl(pc),d0 *展開数を計算
mulu.w bpl(pc),d0
move.w d0,tenkai_cnt
move.w #$00c0,d3 *マスク用データ設定
move.w #$003f,d4
cmp.w #8,bit_cnt
bcs pcx4_ten
beq pcx8_ten
bra pcx24_ten
pcx4_ten:
movea.l gr_addr(pc),a3 *コンバート先
move.w tate(pc),d7 *展開ライン数
cmp.w #1024,d7
bls pcx4_ten1
move.w #1024,d7
pcx4_ten1:
subq.w #1,d7
move.w yoko(pc),d0 *水平→垂直変換数
addq.w #7,d0
lsr.w #3,d0
move.w d0,d1
subq.w #1,d0
move.w d0,henkan_cnt
pcx4_ten2:
movea.l work_addr(pc),a0 *展開先アドレス
bsr pcx_ten *ワークに展開
bsr pcx4_conv *コンバート
dbra.w d7,pcx4_ten2
rts
pcx4_conv:
movea.l work_addr(pc),a0 *展開もと
move.w henkan_cnt(pc),d6 *ループ数
movea.w ikisugi(pc),a1 *行き過ぎ
move.w d3,d5 *レジスタBackUp
swap.w d5
move.w d4,d5
pcx4_conv1:
move.w bpl(pc),d0
movea.l a0,a4
adda.w d0,a4
movea.l a4,a5
adda.w d0,a5
movea.l a5,a6
adda.w d0,a6
pcx4_conv2:
move.b (a0)+,d4
move.b (a4)+,d3
move.b (a5)+,d2
move.b (a6)+,d1
add.b d1,d1
roxl.b #1,d0
add.b d2,d2
roxl.b #1,d0
add.b d3,d3
roxl.b #1,d0
add.b d4,d4
roxl.b #1,d0
add.b d1,d1
roxl.b #1,d0
add.b d2,d2
roxl.b #1,d0
add.b d3,d3
roxl.b #1,d0
add.b d4,d4
roxl.b #1,d0
move.b d0,(a3)+
add.b d1,d1
roxl.b #1,d0
add.b d2,d2
roxl.b #1,d0
add.b d3,d3
roxl.b #1,d0
add.b d4,d4
roxl.b #1,d0
add.b d1,d1
roxl.b #1,d0
add.b d2,d2
roxl.b #1,d0
add.b d3,d3
roxl.b #1,d0
add.b d4,d4
roxl.b #1,d0
move.b d0,(a3)+
add.b d1,d1
roxl.b #1,d0
add.b d2,d2
roxl.b #1,d0
add.b d3,d3
roxl.b #1,d0
add.b d4,d4
roxl.b #1,d0
add.b d1,d1
roxl.b #1,d0
add.b d2,d2
roxl.b #1,d0
add.b d3,d3
roxl.b #1,d0
add.b d4,d4
roxl.b #1,d0
move.b d0,(a3)+
add.b d1,d1
roxl.b #1,d0
add.b d2,d2
roxl.b #1,d0
add.b d3,d3
roxl.b #1,d0
add.b d4,d4
roxl.b #1,d0
add.b d1,d1
roxl.b #1,d0
add.b d2,d2
roxl.b #1,d0
add.b d3,d3
roxl.b #1,d0
add.b d4,d4
roxl.b #1,d0
move.b d0,(a3)+
dbra.w d6,pcx4_conv2
move.w d5,d4 *レジスタ戻す
swap.w d5
move.w d5,d3
rts
pcx8_ten:
movea.l gr_addr(pc),a3 *展開先
move.w tate(pc),d7 *展開ライン数
subq.l #1,d7
move.w yoko(pc),d6
addq.w #3,d6
andi.w #$fffc,d6
pcx8_ten1:
movea.l a3,a0
bsr pcx_ten *直接展開
adda.w d6,a3
dbra.w d7,pcx8_ten1
rts
pcx24_ten:
movea.l gr_addr(pc),a3 *コンバート先
move.w tate(pc),d5 *縦ライン数
subq.l #1,d5
move.w #$00f8,d7 *マスクデータ
tst.b dflg *ディザもどきあり?
beq pcx24_ten2 *指定無し
pcx24_ten1:
movea.l work_addr(pc),a0 *展開先アドレス
bsr pcx_ten *ワークに展開
bsr pcx24_conv *コンバート
dbra.w d5,pcx24_ten1
bra pcx24_ten3
pcx24_ten2:
movea.l work_addr(pc),a0 *展開先アドレス
bsr pcx_ten *ワークに展開
bsr pcx24_dnashi *コンバート
dbra.w d5,pcx24_ten2
pcx24_ten3:
rts
pcx24_conv:
movem.l d3-d7/a2,-(sp)
movea.l work_addr(pc),a1 *展開もと
move.w bpl(pc),d0 *G・Rへのオフセット
movea.l a1,a4
adda.w d0,a4
movea.l a4,a5
adda.w d0,a5
lea.l d_pat(pc),a6
moveq.l #3,d3
move.w yoko(pc),d6 *変換数
subq.w #1,d6
move.w d5,d0
and.w d3,d0
add.w d0,d0
add.w d0,d0
lea.l 0(a6,d0.w),a2
pcx24_conv3:
move.w d6,d0
and.w d3,d0
move.b 0(a2,d0.w),d0
move.b (a5)+,d1
add.b d0,d1
bcc pcx24_conv3_
moveq.l #31*2,d1
bra pcx24_conv4
pcx24_conv3_:
and.w d7,d1
lsr.b #2,d1
pcx24_conv4:
move.b (a4)+,d2
add.b d0,d2
bcc pcx24_conv4_
ori.w #$f800,d1
bra pcx24_conv5
pcx24_conv4_:
and.w d7,d2
* ror.w #8,d2
move.b d2,-(sp) *ror.w #8,d2の代わり
move.w (sp)+,d2 *
clr.b d2 *
or.w d2,d1
pcx24_conv5:
move.b (a1)+,d2
add.b d0,d2
bcc pcx24_conv5_
ori.w #$07c0,d1
bra pcx24_conv6
pcx24_conv5_:
and.w d7,d2
rol.w #3,d2
or.w d2,d1
pcx24_conv6:
move.w d1,(a3)+
dbra d6,pcx24_conv3
movem.l (sp)+,d3-d7/a2
rts
pcx24_dnashi:
move.l d3,a6
movea.l work_addr(pc),a1 *展開もと
move.w bpl(pc),d0 *G・Rへのオフセット
movea.l a1,a4
adda.w d0,a4
movea.l a4,a5
adda.w d0,a5
move.w yoko(pc),d6 *変換数
subq.w #1,d6
pcx24_dnashi_:
move.b (a1)+,d3 *B
move.b (a4)+,d2 *G
move.b (a5)+,d1 *R
and.w d7,d1
and.w d7,d2
and.w d7,d3
lsr.w #2,d1
lsl.w #3,d3
* lsl.w #8,d2
move.b d2,-(sp) *lsl.w #8,d2の代わり
move.w (sp)+,d2 *
clr.b d2 *
or.w d2,d1
or.w d3,d1
move.w d1,(a3)+
dbra.w d6,pcx24_dnashi_
move.l a6,d3
rts
*****************************************************************
* 展開ルーチン *
*****************************************************************
pcx_ten:
move.w tenkai_cnt(pc),d2 *展開数
bra pcx_ten1
pcx_ten0:
subq.w #1,d1
pcx_ten0_:
move.b d0,(a0)+
dbra.w d1,pcx_ten0_
pcx_ten1:
move.b (a2)+,d1 *数
move.b d1,d0
and.w d3,d0
cmp.w d3,d0
beq pcx_ten2
move.b d1,(a0)+
subq.w #1,d2
bne pcx_ten1
rts
pcx_ten2:
and.w d4,d1 *かず
move.b (a2)+,d0 *いろ
sub.w d1,d2
bne pcx_ten0
pcx_ten3
move.b d0,(a0)+
dbra.w d1,pcx_ten3
rts
*****************************************************************
* グラフィックを表示する *
*****************************************************************
pcx_prt:
cmp.w #8,bit_cnt
bcs pcx4_prt
beq pcx8_prt
bra pcx24_prt
pcx4_prt:
bsr _pcx4_prt
bra pcx_prt_end
pcx8_prt:
bsr _pcx8_prt
bra pcx_prt_end
pcx24_prt:
bsr _pcx24_prt
* bra pcx_prt_end
pcx_prt_end:
rts
*****************************************************************
* 画面モードの設定 *
*****************************************************************
crtmode_set:
cmp.w #8,bit_cnt
bcs crtmode_set1
beq crtmode_set2
bra crtmode_set3
crtmode_set1: *16色
move.w bit4_crtdef(pc),crt_mode
move.w #$04,vctr_r0
move.w #$30,vctr_r2
bra crtmode_set4
crtmode_set2: *256色
move.w #5,crt_mode
move.w #$01,vctr_r0
move.w #$23,vctr_r2
bra crtmode_set4
crtmode_set3: *32k色・1677色(Full)
move.w #6,crt_mode
move.w #$03,vctr_r0
move.w #$2f,vctr_r2
bra crtmode_set4
crtmode_set4:
rts
*****************************************************************
* スクロール変数の設定 *
*****************************************************************
scroll_var_set:
lea.l dot_tbl(pc),a0 *ドット数テーブル
move.w crt_mode(pc),d0
add.w d0,d0
add.w d0,d0
move.l 0(a0,d0.w),a0
move.w (a0),crt_x *CRTのXドット数
move.w 2(a0),crt_y * Yドット数
move.w yoko(pc),d0 *横スクロール出来るドット数を計算
sub.w crt_x(pc),d0
bpl sv_set0
clr.w d0
sv_set0:
move.w d0,x_max
move.w tate(pc),d0 *縦スクロール出来るドット数を計算
sub.w crt_y(pc),d0
bpl sv_set1
clr.w d0
sv_set1:
move.w d0,y_max
cmp.w #4,bit_cnt *4bitか
bne sv_set4 *違う
sv_set2: *4bit(16色)の時は、実画面スクロールのみ
move.w #1024,d0
sub.w crt_x(pc),d0
cmp.w x_max(pc),d0
bcc sv_set3
move.w d0,x_max
sv_set3:
move.w #1024,d0
sub.w crt_y(pc),d0
cmp.w y_max(pc),d0
bcc sv_set4
move.w d0,y_max
sv_set4:
rts
*****************************************************************
* 画面の初期化を行う *
*****************************************************************
scr_int:
st int_flg *画面の初期化は一回だけ
move.w clr_mode(pc),d0 *テキスト画面消去の指定があるか
btst.l #0,d0
beq scr_int9 *指定無し
IOCS _MS_CUROF *マウスカーソル消す
moveq.l #0,d1 *ソフトキーボード消す
moveq.l #0,d2
IOCS _SKEY_MOD
bsr func_off *ファンクションキー消す
bsr text_clr *テキスト消去
move.w #$1e,d1 *カーソルをHOMEポジションへ
IOCS _B_PUTC
scr_int9:
rts
*****************************************************************
* 画面のモードの初期化を行う *
*****************************************************************
crtmode_int:
move.w vctr_r0(pc),$e82400 *色モード・実画面サイズ設定
move.w #$06e4,$e82500 *00_00_01_10_11100100
cmp.w #2,clr_mode *グラフィック画面消去の指定
bcs crtmode_int1 *指定無し
clr $e82600 *GR・TEXT画面オフ
bra crtmode_int2
crtmode_int1:
move.w vctr_r2(pc),$e82600 *GR・TEXT画面オン
crtmode_int2:
bsr v_wait
bsr crtc_set *crtcレジスタ設定
rts
*****************************************************************
* グラフィック画面の消去 *
*****************************************************************
gr_int:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_int9 *指定無し
gr_int0:
tst.b mflg
bne gr_int1 *強制MPUクリア
cmp.w #4,bit_cnt *16色以下か
bhi gr_int3 *違う
move.w yoko(pc),d0
cmp.w crt_x(pc),d0
bhi gr_int1
move.w tate(pc),d0
cmp.w crt_y(pc),d0
bcs gr_int3
gr_int1:
move.w $e80028,-(sp)
movem.l d0-d7/a0-a6,-(sp)
move.b #3,$e80028
moveq.l #0,d0 *レジスタクリア
move.l d0,d1
move.l d0,d2
move.l d0,d3
move.l d0,d4
move.l d0,d5
move.l d0,d6
move.l d0,d7
movea.l d0,a1
movea.l d0,a2
movea.l d0,a3
movea.l d0,a4
movea.l d0,a5
movea.l d0,a6
movea.l #GRAM_MAX,a0
move.w #512,line_cnt
gr_int2:
movem.l d0-d7/a1-a6,-(a0) *14*4=56
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d7/a1-a6,-(a0)
movem.l d0-d3,-(a0)
subq.w #1,line_cnt
bne gr_int2
movem.l (sp)+,d0-d7/a0-a6
move.w (sp)+,$e80028
bra gr_int9
gr_int3:
move.w $e8002a,-(sp) *ハードウェアクリア
bsr v_wait
move.w #$0f,$e8002a
move.b #$02,$e80481
bsr v_wait
move.w (sp)+,$e8002a
gr_int9:
rts
*****************************************************************
* グラフィックのオン *
*****************************************************************
gr_on:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_on1
gr_on0:
bsr v_wait
move.w vctr_r2(pc),$e82600 *GR・TEXT画面オン
gr_on1:
rts
*****************************************************************
* グラフィックのオフ *
*****************************************************************
gr_off:
cmp.w #2,clr_mode *グラフィック画面消去の指定が無い時は無視
bcs gr_off1
gr_off0:
bsr v_wait
clr.w $e82600 *GR・TEXT画面オフ
gr_off1:
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
sf esc_flg
sf next_flg
sf inkey_flg1
sf inkey_flg2
sf inkey_flg3
cmp.w #8,bit_cnt
bcs bit4_scroll
beq bit8_scroll
bhi bit24_scroll
bit4_scroll:
bsr _pcx4_scroll
bra scroll9
bit8_scroll:
bsr _pcx8_scroll
bra scroll9
bit24_scroll:
bsr _pcx24_scroll
* bra scroll9
scroll9:
rts
*****************************************************************
* キー入力チェック *
*****************************************************************
key_chk:
movea.w #$800,a0
btst.b #1,(a0) *ESCが押されたか?
beq key_chk_ *押されていない
st esc_flg *ESCスイッチON
bra key_chk9
key_chk_:
btst.b #7,1(a0) *BSが押されたか?
beq key_chk0 *押されていない
st esc_flg *ESCスイッチON
bra key_chk9
key_chk0:
btst.b #5,3(a0) *RETURNが押されたか?
beq key_chk1 *押されていない
st next_flg *NEXTスイッチON
bra key_chk9
key_chk1:
btst.b #5,6(a0) *SPACEが押されたか?
beq key_chk2
st next_flg
bra key_chk9
key_chk2:
btst.b #6,9(a0) *ENTERが押されたか?
beq key_chk3
st next_flg
bra key_chk9
key_chk3:
btst.b #6,6(a0) *HOMEが押されたか?
beq key_chk4
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
bsr inf_change *情報表示の変更
bra key_chk9
key_chk4:
btst.b #2,7(a0) *UNDOが押されたか?
beq key_chk8
tst.b inkey_flg1
bne key_chk9
st inkey_flg1
bsr inf_change *情報表示の変更
bra key_chk9
key_chk8:
sf inkey_flg1
key_chk9:
rts
*****************************************************************
* カーソル入力チェック *
*****************************************************************
cursor_chk:
movea.w #$807,a0 *カーソルキーのチェック
move.b (a0),d0
ror.b #3,d0
andi.w #$000f,d0
move.b d0,scroll_key
rts
*****************************************************************
* テンキー入力チェック *
*****************************************************************
tenkey_chk:
movea.w #$808,a0
lea.l scroll_key(pc),a1
btst.b #4,(a0) *8押されたか?
beq tenkey_chk0 *押されていない
or.b #2,(a1) *上セット
tenkey_chk0:
btst.b #7,(a0) *4が押されたか?
beq tenkey_chk1 *押されていない
or.b #1,(a1) *右セット
tenkey_chk1:
movea.w #$809,a0
btst.b #1,(a0) *6が押されたか?
beq tenkey_chk2 *押されていない
or.b #4,(a1) *左セット
tenkey_chk2:
btst.b #4,(a0) *2が押されたか?
beq tenkey_chk3 *押されていない
or.b #8,(a1) *下セット
tenkey_chk3:
rts
*****************************************************************
* マウスの入力チェック *
*****************************************************************
mouse_chk:
IOCS _MS_GETDT *マウスからのデータをGET
cmpi.b #$ff,d0 *右ボタンが押されたか
beq mouse_right *押された
andi.w #$ff00,d0 *左ボタンが押されたか
bne mouse_left *押された
sf inkey_flg2
bra mouse_chk1
mouse_right:
andi.w #$ff00,d0 *更に左ボタンが押されたか
bne mouse_right1 *押された
tst.b inkey_flg2
bne mouse_right0
st inkey_flg2
bsr inf_change *情報表示の変更
mouse_right0:
IOCS _MS_GETDT *マウスからのデータをGET
andi.w #$ff00,d0 *左ボタンが押されたか
beq mouse_chk1 *押されていない
mouse_right1:
st esc_flg *ESCスイッチON
bra mouse_chk1
mouse_left:
st next_flg *NEXTスイッチON
mouse_chk1:
swap d0
move.w d0,d1
andi.w #$ff00,d0 *上位を残す
andi.w #$00ff,d1 *下位を残す
ror.w #8,d0 *
lea.l scroll_key(pc),a1
ms_xp: *X方向の移動量を調べる
tst.b d0 *移動量がプラス方向か?
beq ms_yp *入力なし
blt ms_xm *マイナスなら飛ぶ
cmp.b #1,d0
bls ms_yp *移動量が少なければ無視
or.b #4,(a1) *右セット
bra ms_yp
ms_xm:
cmp.b #-1,d0
bcc ms_yp
or.b #1,(a1) *左セット
* bra ms_yp
ms_yp: *Y方向の移動量を調べる
tst.b d1 *移動量がプラス方向か?
beq mouse_chk9 *入力なし
blt ms_ym *マイナスなら飛ぶ
cmp.b #1,d1
bls mouse_chk9 *移動量が少なければ無視
or.b #8,(a1) *下セット
bra mouse_chk9
ms_ym:
cmp.b #-1,d1
bcc mouse_chk9
or.b #2,(a1) *上セット
* bra mouse_chk9
mouse_chk9:
rts
*****************************************************************
* CRTCの値を設定する *
*****************************************************************
crtc_set:
lea.l crtc_tbl(pc),a0
move.w crt_mode(pc),d0
add.w d0,d0
add.w d0,d0
move.l 0(a0,d0.w),a0
tst.w (a0)+ *HRL=0?
beq crtc_set0
or.b #%0010,$e8e007 *HRLビットを立てる
bra crtc_set1
crtc_set0:
bclr.b #1,$e8e007 *HRLビットを消す
crtc_set1:
movea.l #$e80000,a1
move.w (a0)+,$28(a1) *crtc r20
move.l (a0)+,(a1)+ *crtc r00-r08
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.l (a0)+,(a1)+
move.w (a0),(a1)
rts
*****************************************************************
* 情報の表示/非表示の変更を行う *
*****************************************************************
inf_change:
add.b #1,prt_flg
cmp.b #2,prt_flg
bcs inf_change1
beq inf_change2
bra inf_change0
inf_change0:
bsr inf_off *情報消去
bsr _Tone_up
clr.b prt_flg
bra inf_change9
inf_change1:
bsr inf_prt *情報表示
bra inf_change9
inf_change2:
bsr _Tone_down
inf_change9:
rts
inf_mode:
cmp.b #1,prt_flg
bcs inf_mode9
beq inf_mode1
bra inf_mode2
inf_mode1:
bsr inf_prt *情報表示
bra inf_mode9
inf_mode2:
bsr inf_prt *情報表示
bsr _Tone_down
inf_mode9:
rts
*****************************************************************
* 情報の表示 *
*****************************************************************
inf_prt:
tst.b prt_flg
beq inf_prt9 *ゼロなら表示しない
bsr v_wait
bsr inf_off
bsr name_prt *ファイル名の表示
bsr size_prt *サイズの表示
bsr col_prt *色数の表示
inf_prt9:
rts
*****************************************************************
* ファイル名の表示 *
*****************************************************************
name_prt:
lea.l prt_buf(pc),a0 *表示バッファの先頭アドレス
lea.l inf1(pc),a1 *'ファイル名:'をコピー
bsr strcpy
lea.l filbuf(pc),a1 *ファイル名をコピーする
lea.l 30(a1),a1 *
bsr strcpy
lea.l crlf_mes(pc),a1 *改行コードをコピー
bsr strcpy
lea.l prt_buf(pc),a1
IOCS _B_PRINT *ファイル名を表示
rts
*****************************************************************
* 画像サイズの表示 *
*****************************************************************
size_prt:
lea.l prt_buf(pc),a0 *コピー先
lea.l inf2(pc),a1 *'画像サイズ:'をコピー
bsr strcpy
movea.l a0,a2
moveq.l #0,d0 *横サイズ
move.w yoko(pc),d0
bsr suji_set
move.b #'x',(a2)+ *'x'
moveq.l #0,d0 *縦サイズ
move.w tate(pc),d0
bsr suji_set
movea.l a2,a0
lea.l crlf_mes(pc),a1 *改行コードをコピー
bsr strcpy
lea.l prt_buf(pc),a1
IOCS _B_PRINT *画像サイズを表示
rts
*****************************************************************
* 色数の表示 *
*****************************************************************
col_prt:
lea.l prt_buf(pc),a0 *コピー先
lea.l inf3(pc),a1 *'色数 :'をコピー
bsr strcpy
move.w bit_cnt(pc),d0
cmp.w #8,d0 *256色
bcs col_4
beq col_8
cmp.w #24,d0 *Full color(16777216)
beq col_24
bra col_?? *不明
col_4:
lea.l col4(pc),a1
bra col_set
col_8:
lea.l col8(pc),a1
bra col_set
col_24:
lea.l col24(pc),a1
bra col_set
col_??:
lea.l col??(pc),a1
* bra col_set
col_set
bsr strcpy *色数をコピー
lea.l crlf_mes(pc),a1 *改行コードをコピー
bsr strcpy
lea.l prt_buf(pc),a1
IOCS _B_PRINT *色数を表示
rts
*****************************************************************
* 数字の設定 *
*****************************************************************
suji_set:
lea.l num_buf(pc),a0
move.b #0,11(a0) *終了位置
bsr bin2dec
bsr zero_keshi
suji_set1:
move.b (a0)+,(a2)+
bne suji_set1
subq.l #1,a2
rts
*****************************************************************
* 2進=>10進 *
* d0 変換元の数値 a0 変換後の格納アドレス *
*****************************************************************
bin2dec:
movem.l d0-d3/a0-a1,-(sp)
moveq.l #10-1,d1
lea.l exp_tbl(pc),a1
bin2dec0:
clr.b d2
move.l (a1)+,d3
bin2dec1:
or d3,d3
sub.l d3,d0
bcs bin2dec2
addq.b #1,d2
bra bin2dec1
bin2dec2:
add.l d3,d0
add.b #'0',d2
move.b d2,(a0)+
dbra d1,bin2dec0
movem.l (sp)+,d0-d3/a0-a1
rts
exp_tbl:
.dc.l 1000000000
.dc.l 100000000
.dc.l 10000000
.dc.l 1000000
.dc.l 100000
.dc.l 10000
.dc.l 1000
.dc.l 100
.dc.l 10
.dc.l 1
*****************************************************************
* 頭にある'0'を消す *
*****************************************************************
zero_keshi:
lea.l num_buf(pc),a0
move.w #9-1,d0 *最期の'0'は残す
zero_keshi0:
cmp.b #'0',(a0)
bne zero_keshi9
move.b #SPACE,(a0)+
zero_keshi1:
dbra d0,zero_keshi0
zero_keshi9:
rts
*****************************************************************
* 情報の消去 *
*****************************************************************
inf_off:
move.w #$1a,d1 *TEXTクリア&HOMEポジションへ
IOCS _B_PUTC
rts
*****************************************************************
* ファイルのOPENを行う *
*****************************************************************
file_open:
move.w #0,-(sp) *ファイルopen
move.l a0,-(sp)
DOS _OPEN
addq.l #6,sp
tst.l d0 *OK?
bmi open_err
move.l d0,d7 *ファイルハンドルセーブ
rts
*****************************************************************
* ファイルのサイズを求める(d6に返す) *
*****************************************************************
file_size:
move.w #2,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
move.l d0,d6
move.w #0,-(sp)
move.l #0,-(sp)
move.w d7,-(sp)
DOS _SEEK
addq.l #8,sp
tst.l d0 *OK?
bmi read_err
rts
*****************************************************************
* ディスクからデータの読み込みを行う *
*****************************************************************
file_read:
move.l d6,-(sp) *データサイズ
move.l a4,-(sp) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _READ
lea 10(sp),sp *スタック補正
tst.l d0 *OK?
bmi read_err
cmp.l d6,d0 *全部読めたか
bne read_err
rts
*****************************************************************
* ファイルをCLOSEする *
*****************************************************************
file_close:
move.w d7,-(sp) *ファイルCLOSE
DOS _CLOSE
addq.l #2,sp
rts
*****************************************************************
* スクロール画面の初期化 *
*****************************************************************
scroll_int:
clr.w d2 *スクロール座標初期化
clr.w d3
bsr x_set
bsr y_set
rts
*****************************************************************
* グラフィック画面のスクロールを行う *
*****************************************************************
go_scroll:
bsr v_wait
bsr x_set
bsr y_set
rts
*****************************************************************
* スクロールX座標セット *
*****************************************************************
x_set:
movea.l #$e80000,a0
move.w d2,d0 *X座標
move.w d0,crtc_r12(a0)
move.w d0,crtc_r14(a0)
cmp.w #8,bit_cnt *8BitColor
bne x_set1
add.w #256,d0 *page1のX座標(256色)
x_set1:
move.w d0,crtc_r16(a0)
move.w d0,crtc_r18(a0)
rts
*****************************************************************
* スクロールY座標セット *
*****************************************************************
y_set:
movea.l #$e80000,a0
move.w d3,crtc_r13(a0) *スクリーン0のY座標
move.w d3,crtc_r15(a0) *スクリーン1のY座標
move.w d3,crtc_r17(a0) *スクリーン2のY座標
move.w d3,crtc_r19(a0) *スクリーン3のY座標
rts
*****************************************************************
* 画面の動機待ち *
*****************************************************************
v_wait:
movea.l #$e88001,a0
moveq.l #4,d0
v_wait0:
btst.b d0,(a0)
beq v_wait0
v_wait1:
btst.b d0,(a0)
bne v_wait1
rts
*****************************************************************
* テキスト画面の消去 *
*****************************************************************
text_clr:
movem.l d0-d3/a3,-(sp)
move.w $E8002A,d0
move.w #%0000_0001_1111_0000,$E8002A
movea.l #TEXT1,a3
move.w #1024-1,d1
text_clr_lp:
clr.l (a3)+
dbra.w d1,text_clr_lp
move.w d0,$E8002A
move.w #$0001,d1
move.w #255,d2
move.w #$000F,d3
IOCS _TXRASCPY
movem.l (sp)+,d0-d3/a3
rts
*****************************************************************
* waitデータのパス名を設定 *
*****************************************************************
wait_path_set:
lea.l $80(a0),a1 *転送元
lea.l arg2(pc),a0 *転送先
bsr strcpy
lea.l wait_name(pc),a1 *指定したファイル名
bsr strcpy
rts
*****************************************************************
* waitデータ'bmp256.dat'を読み込む *
*****************************************************************
wait_read:
move.w #0,-(sp) *ファイルopen
pea.l arg2(pc)
DOS _OPEN
addq.l #6,sp
tst.l d0 *OK?
bmi wait_read9
move.l d0,d7 *ファイルハンドルセーブ
move.l #2,-(sp) *データサイズ
pea.l _Wait(pc) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _READ
lea 10(sp),sp *スタック補正
move.w _Wait(pc),wait *ワークに取っておく
* tst.l d0 *OK?
* bmi read_err
* cmp.l d6,d0 *全部読めたか
* bne read_err
bsr file_close
wait_read9:
rts
*****************************************************************
* waitデータ'bmp256.dat'を書き込む *
*****************************************************************
wait_write:
move.w wait(pc),d0
cmp.w _Wait(pc),d0
beq wait_write9
move.w #$20,-(sp) *ファイルCREATE
pea.l arg2(pc)
DOS _CREATE
addq.l #6,sp
* tst.l d0 *OK?
* bmi create_err
tst.l d0 *OK?
bmi wait_write9
move.l d0,d7 *ファイルハンドルセーブ
move.l #2,-(sp) *データサイズ
pea.l _Wait(pc) *バッファアドレス
move.w d7,-(sp) *ファイルハンドル
DOS _WRITE
lea.l 10(sp),sp *スタック補正
* tst.l d0 *OK?
* bmi write_err
* cmp.l d6,d0 *全部書き込めたか?
* bne write_err
bsr file_close
lea.l wait_change_mes(pc),a0
bsr mesput
wait_write9:
rts
*****************************************************************
* カーソル消す *
*****************************************************************
cursol_clr:
move.b $992.w,cur_save
beq cursol_clr9
IOCS _OS_CUROF
cursol_clr9:
rts
*****************************************************************
* カーソル戻す *
*****************************************************************
cursol_recv:
tst.b cur_save
beq cursol_recv9
IOCS _OS_CURON
cursol_recv9:
rts
*****************************************************************
* バッファ確保 *
*****************************************************************
buf_get:
pea.l -1.w *確保出来る最大サイズを取得
DOS _MALLOC
addq.l #4,sp
andi.l #$00ffffff,d0
move.l d0,d1
move.l d0,-(sp)
DOS _MALLOC
addq.l #4,sp
tst.l d0
bmi no_buff
move.l d0,buff_addr *バッファアドレス
move.l d1,buff_size *バッファサイズ
rts
*****************************************************************
* バッファ開放 *
*****************************************************************
buf_free:
pea.l buff_addr(pc) *バッファ開放
DOS _MFREE
addq.l #4,sp
rts
*****************************************************************
* スーパーモードにする *
*****************************************************************
super:
clr.l -(sp) *スーパーバイザモードへ移行
DOS _SUPER
addq.l #4,sp
move.l d0,sp_save
rts
*****************************************************************
* ユーザーモードにする *
*****************************************************************
user:
move.l sp_save(pc),-(sp) *ユーザーモードへ
DOS _SUPER
addq.l #4,sp
rts
*****************************************************************
* ファンクション表示を消す *
*****************************************************************
func_off:
lea.l func_off_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 処理したファイル数をチェックする *
*****************************************************************
file_cnt_chk:
tst.w file_cnt *処理したファイルは0個か
bne file_cnt_chk1 *違う
bsr no_file *ファイルが無かった
file_cnt_chk1:
rts
*****************************************************************
* 処理するファイルがなかった *
*****************************************************************
no_file:
lea.l no_file_mes(pc),a0
bsr mesput
rts
*****************************************************************
* ファイル名エラー *
*****************************************************************
name_er:
lea.l name_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* ファイルが見付からない *
*****************************************************************
open_err:
lea.l arg(pc),a0
bsr mesput
lea.l open_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メモリが足りない *
*****************************************************************
no_buff:
bsr file_close
lea.l arg(pc),a0
bsr mesput
lea.l no_buff_mes(pc),a0
bsr mesput
rts
*****************************************************************
* 色違い *
*****************************************************************
but_col_err:
bsr file_close
lea.l arg(pc),a0
bsr mesput
lea.l but_col_mes(pc),a0
bsr mesput
rts
*****************************************************************
* ロード座標エラー *
*****************************************************************
but_pos:
bsr file_close *ファイルクローズ
lea.l arg(pc),a0
bsr mesput
lea.l but_pos_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 読み込みエラー *
*****************************************************************
read_err:
lea.l arg(pc),a0
bsr mesput
lea.l read_er_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* 使用方表示 *
*****************************************************************
usage:
lea.l usage_mes(pc),a0
bsr mesput
bra exit2
*****************************************************************
* メッセージ表示 *
*****************************************************************
mesput:
* move.w #STDERR,-(sp) *標準エラー出力へ
move.w #STDOUT,-(sp) *標準出力へ
move.l a0,-(sp) *メッセージを
DOS _FPUTS *出力する
addq.l #6,sp *スタック補正
rts
*****************************************************************
* 終了処理 *
*****************************************************************
exit:
bsr cursol_recv *カーソル戻す
IOCS _MS_INIT *キーバッファクリア
moveq.l #-1,d1
IOCS _SKEY_MOD
move.w #-1,-(sp)
DOS _KFLUSH
addq.l #2,sp
rts
*****************************************************************
* エラー処理2 *
*****************************************************************
exit2:
bsr exit
move.w #1,-(sp) *終了コード1を持って
DOS _EXIT2 * エラー終了
*****************************************************************
* データエリア *
*****************************************************************
.data
.even
usage_mes:
.dc.b '16,256,full color PCX Loader V0.04 by A.MUKAWA',CR,LF
.dc.b '機能:PCXファイルを表示します',CR,LF
.dc.b '用法:LDPCX [スイッチ] ファイル名',CR,LF
.dc.b CR,LF
.dc.b ' /L[x,y] ロード座標の指定',CR,LF
.dc.b ' /LC 画面中央に表示',CR,LF
.dc.b ' /K 表示後にキー入力待ち',CR,LF
.dc.b ' /Sn 16色PCXの画面モード設定',CR,LF
.dc.b ' n=0 768x512 31K (DEF)',CR,LF
.dc.b ' n=1 384x256 31K',CR,LF
.dc.b ' n=2 640x400 24K',CR,LF
.dc.b ' n=3 640x480 24K',CR,LF
.dc.b ' n=4 1024x848 24K',CR,LF
.dc.b ' /Cn 画面クリアモードの設定',CR,LF
.dc.b ' n=0 画面消去を行わない',CR,LF
.dc.b ' n=1 テキスト画面のみ消去(DEF)',CR,LF
.dc.b ' n=2 グラフィック画面のみ消去',CR,LF
.dc.b ' n=3 テキスト画面とグラフィック画面を消去',CR,LF
.dc.b ' /D ディザ表示(フルカラーPCXのみ有効)',CR,LF
.dc.b ' /M MPUに頑張ってもらう',CR,LF
.dc.b CR,LF
.dc.b ' /K指定時、画面からはみ出た部分があるとスクロール出来ます',CR,LF
.dc.b ' 但し16色ファイルは1024x1024dotまでの表示になります',CR,LF
.dc.b ' また、以下のキー操作を行えます',CR,LF
.dc.b " 'HOME' 情報表示モードの変更",CR,LF
.dc.b CR,LF
.dc.b ' 768x512dot 256色モードは、Oh!X 1995年11月号に掲載された',CR,LF
.dc.b ' 菊池功氏の "PageSync()関数"を使用しています。',CR,LF
.dc.b ' 256色モードのちらつきはテンキーの"+","-"で調節出来ます。',CR,LF
.dc.b 0
no_file_mes:
.dc.b '表示できるファイルがありません!',CR,LF,0
name_er_mes:
.dc.b 'ファイル名の指定に間違いがあります!',CR,LF,0
open_er_mes:
.dc.b ' が見つかりません!',CR,LF,0
read_er_mes:
.dc.b ' の読み込みエラーが発生しました!',CR,LF,0
no_buff_mes:
.dc.b ' の表示に必要なメモリがありません!',CR,LF,0
but_col_mes:
.dc.b ' は未サポートの色数です!',CR,LF,0
but_pos_mes:
.dc.b ' は指定した座標にロード出来ません!',CR,LF,0
wait_change_mes:
.dc.b 'ウェイトを変更しました',CR,LF,0
crlf_mes:
.dc.b CR,LF,0
func_off_mes:
.dc.b $1b,$5b,$3e,$31,$68,0
dext:
.dc.b '.PCX',0 *補う拡張子
komekome:
.dc.b '\'
kome0:
.dc.b '*.PCX',0
wait_name:
.dc.b 'bmp256.dat',0
.even
kflg:
.dcb.b 1,0 */Kスイッチon/offフラグ(=0...off,<>0...on)
sflg:
.dcb.b 1,0 */Sスイッチon/offフラグ(=0...off,<>0...on)
cflg:
.dcb.b 1,0 */Cスイッチon/offフラグ(=0...off,<>0...on)
lflg:
.dcb.b 1,0 */Lスイッチon/offフラグ(=0...off,<>0...on)
lcflg:
.dcb.b 1,0 */LCスイッチon/offフラグ(=0...off,<>0...on)
dflg:
.dcb.b 1,0 */Dスイッチon/offフラグ(=0...off,<>0...on)
nflg:
.dcb.b 1,0 */Nスイッチon/offフラグ(=0...off,<>0...on)
mflg:
.dcb.b 1,0 */Mスイッチon/offフラグ(=0...off,<>0...on)
int_flg:
.dcb.b 1,0 *
prt_flg:
.dcb.b 1,0 *画像情報の表示/非表示フラグ
.even
s_dot4:
.dcb.w 1,8
s_dot8:
.dcb.w 1,4
s_dot24:
.dcb.w 1,8
crt_max:
.dc.w 5-1
crtc_tbl:
.dc.l mode0
.dc.l mode1
.dc.l mode2
.dc.l mode3
.dc.l mode4
.dc.l mode5
.dc.l mode6
crtc_data:
* HRL R20 R00 R01 R02 R03 R04 R05 R06 R07 R08
mode0: .dc.w $00,$416, $89, $0E, $1C, $7C,$237, $05, $28,$228, $1B * 768x512 31kHz
mode1: .dc.w $01,$411, $44, $05, $0A, $3A,$237, $05, $28,$228, $1B * 384x256 31kHz
mode2: .dc.w $00,$415, $74, $09, $14, $64,$1D0, $07, $20,$1B0, $1B * 640x400 24kHz
*mode3: .dc.w $00,$415, $72, $08, $14, $64,$1DA, $08, $1E,$1CE, $1B * 640x432 24kHz
mode3: .dc.w $00,$416, $89, $0F, $21, $71,$204, $02, $20,$200, $16 * 640x480 31kHz
mode4 .dc.w $00,$41e, $AC, $0C, $1D, $9D,$1DA, $08, $21,$1C9, $1B *1024x848 24kHz
mode5: .dc.w $00,$116, $89, $0E, $1C, $7C,$237, $05, $28,$228, $1B * 768*512 256色モード
mode6: .dc.w $00,$316, $89, $0E, $2C, $6C,$237, $05, $28,$228, $1B * 512*512 64k色モード
dot_tbl:
.dc.l dot0
.dc.l dot1
.dc.l dot2
.dc.l dot3
.dc.l dot4
.dc.l dot5
.dc.l dot6
dot_data:
dot0: .dc.w 768,512
dot1: .dc.w 384,256
dot2: .dc.w 640,400
dot3: .dc.w 640,480
dot4: .dc.w 1024,848
dot5: .dc.w 768,512
dot6: .dc.w 512,512
col4: .dc.b '16',0
col8: .dc.b '256',0
col24: .dc.b 'full',0
col??: .dc.b '????',0
inf1: .dc.b 'ファイル名:',0
inf2: .dc.b '画像サイズ:',0
inf3: .dc.b '色数 :',0
d_pat:
.dc.b 0, 4, 1, 5 *ディザパターン1
.dc.b 6, 2, 7, 3
.dc.b 1, 5, 0, 4
.dc.b 7, 3, 6, 2
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
filbuf:
.ds.b 53 *ファイル情報格納バッファ
nambuf:
.ds.b 92 *ファイル名展開用バッファ
arg:
.ds.b 256 *ファイル名バッファ
arg2:
.ds.b 256 *'bmp256.dat'用バッファ
prt_buf:
.ds.b 96+3 *画面表示バッファ
num_buf:
.ds.b 10+1 *数値変換バッファ
.even
file_cnt:
.ds.w 1 *ファイル数のカウント用バッファ
sp_save:
.ds.l 1
buff_addr:
.ds.l 1 *画像読み込みバッファアドレス
buff_size:
.ds.l 1 *画像読み込みバッファサイズ
work_addr:
.ds.l 1 *ワークアドレス
gr_addr:
.ds.l 1 *変換後画像アドレス
gr_size:
.ds.l 1 *画像サイズ
fi_size:
.ds.l 1 *ファイルサイズ
yoko:
.ds.w 1 *画像の横(X)サイズ
tate:
.ds.w 1 *画像の縦(Y)サイズ
crt_x:
.ds.w 1 *画面のXサイズ
crt_y:
.ds.w 1 *画面のYサイズ
x_pos:
.ds.w 1 *ロード時のX座標
y_pos:
.ds.w 1 *ロード時のY座標
x_old:
.ds.w 1 *前回のX座標
y_old:
.ds.w 1 *前回のY座標
x_max:
.ds.w 1
y_max:
.ds.w 1
crt_mode:
.ds.w 1 *画面モード
clr_mode:
.ds.w 1 *画面クリアモード
bit4_crtdef:
.ds.w 1 *16色BMPの画面モード
vctr_r0:
.ds.w 1
vctr_r2:
.ds.w 1
line_cnt:
.ds.w 1
bpl:
.ds.w 1
bpp:
.ds.w 1
npl:
.ds.w 1
bit_cnt:
.ds.w 1
tenkai_cnt:
.ds.w 1
henkan_cnt:
.ds.w 1
ikisugi:
.ds.w 1
esc_flg:
.ds.b 1 *
next_flg:
.ds.b 1 *
skip_flg:
.ds.b 1 *
inkey_flg1:
.ds.b 1 *
inkey_flg2:
.ds.b 1 *
inkey_flg3:
.ds.b 1 *
scroll_key:
.ds.b 1 *スクロール処理のキー
cur_save:
.ds.b 1 *
.even
wait:
.ds.w 1 *768x512 256モードのウェイトワーク
my_stack:
.ds.l 1024
mysp:
.end start